"""
    生成银行借记卡卡号
"""
import random


def generate_bank_card_number():
    """
    生成银行借记卡卡号
    """
    # 常见的银行卡BIN号段（部分示例）
    bank_bins = [
        "622202",  # 工商银行
        "622848",  # 农业银行
        "622700",  # 建设银行
        "622260",  # 交通银行
        "621799",  # 邮储银行
        "621661",  # 中国银行
        "621468",  # 招商银行
        "621559",  # 中信银行
        "622200",  # 工商银行
        "622841"  # 农业银行
    ]

    # 随机选择一个BIN号段
    bin_number = random.choice(bank_bins)

    # 生成剩余位数（卡号总长度通常为16位或19位）
    remaining_length = 16 - len(bin_number) - 1  # 减1是为了留出校验位
    middle_digits = ''.join([str(random.randint(0, 9)) for _ in range(remaining_length)])

    # 组合卡号（不含校验位）
    card_without_check = bin_number + middle_digits

    # 计算Luhn校验位
    check_digit = calculate_luhn_check_digit(card_without_check)

    # 完整卡号
    card_number = card_without_check + str(check_digit)

    return card_number


def calculate_luhn_check_digit(card_number):
    """
    使用Luhn算法计算校验位
    """

    def digits_of(n):
        return [int(d) for d in str(n)]

    digits = digits_of(card_number)
    odd_digits = digits[-1::-2]
    even_digits = digits[-2::-2]

    checksum = sum(odd_digits)
    for d in even_digits:
        checksum += sum(digits_of(d * 2))

    return (10 - checksum % 10) % 10

bank_bins = {
        "622202":"工商银行",
        "622848":"农业银行",
        "622700":"建设银行",
        "622260":"交通银行",
        "621799":"邮储银行",
        "621661":"中国银行",
        "621468":"招商银行",
        "621559":"中信银行",
        "622200":"工商银行",
        "622841":"农业银行"
}
#写入文件
filename= r"C:\Users\suyujie\Desktop\测试数据\银行卡数据.txt"
with open(filename, "w") as f:
    for i in range(4):
        cardNum = generate_bank_card_number()
        if cardNum[0:6] in bank_bins:
            bankName = bank_bins[cardNum[0:6]]
            f.write(f"{bankName};{cardNum}\n")
            print(f"{bankName};{cardNum}")
